package addition.nio;

import org.junit.Test;

import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.*;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;

public class CharsetDemo {

    /*
     * 通过 availableCharsets() 输出所有可用编码集
     *
     * 通过 static forName(String) 构造编码集实例
     */

    // 输出所有可用编码集
    @Test
    public void test1() {
        SortedMap<String, Charset> charsetMap = Charset.availableCharsets();
        Set<Map.Entry<String, Charset>> entries = charsetMap.entrySet();
        for (Map.Entry<String, Charset> entry : charsetMap.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }

    // 构造编码集实例
    @Test
    public void test2() {
        Charset gbk = Charset.forName("GBK");
    }

    // 构造编码 / 解码器
    @Test
    public void test3() throws CharacterCodingException {
        Charset gbk = Charset.forName("GBK");

        CharBuffer cBuf = CharBuffer.allocate(1024);
        cBuf.put("中国人");
        cBuf.flip();  // 切换为写模式

        CharsetEncoder encoder = gbk.newEncoder();  // 编码器
        CharsetDecoder decoder = gbk.newDecoder();  // 解码器

        // 编码
        ByteBuffer bBuf = encoder.encode(cBuf);  // 默认返回为读模式

        // 输出编码结果
        for (int i = 0; i < bBuf.limit(); i++) {
            System.out.println(bBuf.get());
        }
        bBuf.rewind();  // 重置读指针

        // 正常解码
        CharBuffer cBuf2 = decoder.decode(bBuf);  // 默认返回为读模式
        System.out.println(cBuf2);  // 中国人

        // 非正常解码
        bBuf.rewind();
        CharBuffer cBuf3 = StandardCharsets.UTF_8.decode(bBuf);
        System.out.println(cBuf3);  // �й���
    }

}
